/*
	虚函数可以在一个或多个派生类中被重新定义，但要求在派生类中重新定义时，虚函数的原型，包括返回类型、函数名、参数个数、参数类型的顺序必须完全相同。
	虚函数是在基类中被冠以virtual的成员函数，它提供了一个接口界面.
*/

#include <iostream>

using namespace std;

class Base {
	protected:
		int x;

	public:
		Base(int a) { x = a; }
		virtual void who() {
			cout << "base " << x << endl;
		}
};

class First_d: public Base {
    public:
        First_d(int a): Base(a) {}
        void who() { cout << "First derivation: " << x << endl; }
};

class Second_d: public Base {
    public:
        Second_d(int a): Base(a) {}
        void who() { cout << "Second derivation." << x << endl; }
};

int main(int argc, char * argv[]) {
    Base * p;
    Base base_obj(1);
    First_d first_obj(2);
    Second_d second_obj(3);

    p = & base_obj;
    p->who();

    p = & first_obj;
    p->who();

    p = & second_obj;
    p->who();

    first_obj.who();
    second_obj.who();

    return 0;
}

